package org.totoro.memory.gc;

import com.javamex.classmexer.MemoryUtil;
import org.totoro.structure.list.List;
import org.totoro.structure.list.impl.ArrayList;

/**
 * cms (并发标记清除) 全称  Concurrent mark sweep gc
 * <p>
 * 并行：同一个时间点，有多个线程在执行
 * 并发：同一个时间点，启动了多个线程
 *
 * <pre>
 *     参数介绍：
 *     -XX:+UseConcMarkSweepGC                      老年代启用cms gc，内存碎片过多的时候，并发失败会退化成 UseSerialGC （串行gc）
 *     -XX:+UseParNewGC                             年轻代使用并行垃圾回收器，其实是UseSerialGC 的多线程版本
 *     -XX+UseCMSCompactAtFullCollection            CMS是不会移动内存的， 因此， 这个非常容易产生碎片， 导致内存不够用， 因此， 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。 可能会影响性能,但是可以消除碎片
 *     -XX:CMSFullGCsBeforeCompaction=0             由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理.
 *     -XX:+CMSParallelRemarkEnabled
 *     -XX:CMSInitiatingOccupancyFraction=70        老年代内存使用率达到70％，后开始CMS收集
 *     -XX:ConcGCThreads=1                          并发线程数，一般设置为并发线程数的四分之一，因为这个参数会与用户线程争夺cpu 资源
 *     -XX:ParallelGCThreads=4                      并行垃圾回收线程数，一般与cpu 核一致
 *     -XX:+UseCMSInitiatingOccupancyOnly
 *     -XX:+CMSClassUnloadingEnabled
 *     -XX:+CMSScavengeBeforeRemark                 在CMS GC前启动一次ygc，目的在于减少old gen对ygc gen的引用，降低remark时的开销-----一般CMS的GC耗时 80%都在remark阶段
 * </pre>
 *
 * @author daocr
 * @date 2020/3/8
 */
public class UseConcMarkSweepGCTest {


    public static void main(String[] args) throws InterruptedException {

        List<byte[]> memory = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            memory.add(new byte[1 * 1024 * 1024]);
            Thread.sleep(100);
        }


    }
}
